package com.ucode.springboot.starter.ESsearch.annotation;
import com.ucode.springboot.starter.ESsearch.enums.DataType;
import java.lang.annotation.*;

/**
 * ES 文档索引结构mapping注解,在entity field上添加
 * @author: liliang
 * @date: 2019年12月30日 下午5:31:51
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface ESField {
    /**
     * field 数据类型,选填，默认字符串text
     * text:默认会进行分词，支持模糊查询
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    DataType datatype() default DataType.text_type;
    /**
     * 只对keyword类型有效，默认开启doc_values来加速聚合排序操作，占用了大量磁盘io 如非必须可以禁用doc_values
     * @author liliang
     * @date 2020年1月10日
     * @return
     * @desc
     */
    boolean docValues() default true;
    
    /**
     * 是否是间接关键字
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    boolean keyword() default true;
    /**
     * 关键字忽略字数
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    int ignoreAbove() default 256;
    /**
     * 是否支持ngram，高效全文搜索提示（定制gram分词器，请参照官方例https://www.elastic.co/guide/en/elasticsearch/reference/7.x/analysis-ngram-tokenizer.html）
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    boolean ngram() default false;
    /**
     * 是否支持suggest，高效前缀搜索提示
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    boolean suggest() default false;
    /**
     * 索引分词器设置
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    Analyzer analyzer() default Analyzer.standard;
    /**
     * 搜索内容分词器设置
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    Analyzer searchAnalyzer() default Analyzer.standard;

    /**
     * 是否允许被搜索
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    boolean allowSearch() default true;

    /**
     * 拷贝到哪个字段，代替_all->多个字段合并成一个字段
     * @author liliang
     * @date 2019年12月30日
     * @return
     */
    String copyTo() default "";

    /**
     * nullValue指定，默认空字符串不会为mapping添加null_value
     * 对于值是null的进行处理，当值为null是按照注解指定的‘null_value’值进行查询可以查到
     * 需要注意的是要与根本没有某字段区分（没有某字段需要用Exists Query进行查询）
     * 建议设置值为NULL_VALUE
     * @return
     */
    String nullValue() default "";
    
    /**
     * nested对应的类型，默认为Object.Class。
     * 对于DataType是nested_type的类型才需要添加的注解，通过这个注解生成嵌套类型的索引
     * 例如：
     * @ESMapping(datatype = DataType.nested_type, nestedClass = EsFundDto.class)
     *
     * @return
     */
    Class nestedClass() default Object.class;
}